Sql Server 统计每天量

一、通过天数叠加进行统计

使用 CONVERT(,,)方法将日期精确到日期,然后用DATEADD(,,)方法进行天数叠加

发此方法是用最简单的SQL语句进行统计,分别统计出1天内、2天内、3天内的总的数据记录,然后通过for循环进行减运算,最后得出每天的数据量。此种方法最大的弊端就是时间复杂度太高,而需要遍历n多次数据库才能的得到最终结果。

 public List<int> GetCommitTotal_Personally_ByDay(string username, int queryDays)
    {
        List<int> list = new List<int>();
        SqlConnection conn = connectLocaldb.ConnectDataBase();
        //打开数据库
        conn.Open();
        //创建查询语句
        SqlCommand querySingleInfo = conn.CreateCommand();

        for (int i = 0; i < queryDays; i++)
        {
            querySingleInfo.CommandText = "SELECT COUNT(*) as times FROM MemberCommitBeforeCompiling where UserName=" + "'" + username + "'AND DATEADD(d,-" + i + ", CONVERT(varchar(12), getdate(), 111)) <= CONVERT(varchar(12), CommitTime, 111) ";

            using (SqlDataReader reader = querySingleInfo.ExecuteReader())
            {
                // Loop over the results 
                while (reader.Read())
                {
                    memberCommit.times = reader["times"].ToString().Trim();
                    num[i] = int.Parse(memberCommit.times);
                }
            }
        }
        list.Add(num[0]);
        if (queryDays > 1)
        {
            for (int i = 1; i < queryDays; i++)
            {
                list.Add(num[i] - num[i - 1]);
            }
        }
        list.Reverse();
        //关闭数据库连接
        conn.Close();
        return list;
    }`</pre>
**二、格式化数据类型,直接查询**。

**使用 CONVERT(,,)方法直接格式化精确到日期**

相比于第一种,在时间上得到了很大的优化,只需一次查询就可以得到准确数据。弊端是,如果数据库中没有该日期的数据计划,则不返回数据,所以每一次操作都需要对所得数据进行一次遍历。相对于时间上的优化,这个弊端可以忽略不计。
<pre>`  public Dictionary&lt;int,int&gt; GetCommitByDays(string username,int querydays)
    {
        //以当前日作第一天,0代表今天
        querydays--;
        Dictionary&lt;int, int&gt; commitNumber = new Dictionary&lt;int, int&gt;();
        //连接本地数据库
        SqlConnection conn = connectLocaldb.ConnectDataBase();
        //打开数据库
        conn.Open();
        //创建查询语句
        SqlCommand querySingleInfo = conn.CreateCommand();
        querySingleInfo.CommandText = "SELECT CONVERT(varchar(12), CommitTime, 112) as queryKey, COUNT(CONVERT(varchar(12), CommitTime, 112)) as queryValue FROM MemberCommitBeforeCompiling  where UserName=" + "'" + username + "' and DATEADD(d,-"+querydays+", CONVERT(varchar(12), getdate(), 112)) &lt;= CONVERT(varchar(12), CommitTime, 112)  group by CONVERT(varchar(12), CommitTime, 112) order by CONVERT(varchar(12), CommitTime, 112)desc";
        SqlDataReader singleInfoReader = querySingleInfo.ExecuteReader();
        //有多行数据,用while循环
        while (singleInfoReader.Read())
        {
            int key =int.Parse( singleInfoReader["queryKey"].ToString().Trim());
            int value= int.Parse(singleInfoReader["queryValue"].ToString().Trim());
            commitNumber.Add(key, value);
        }
        //关闭查询
        singleInfoReader.Close();
        //关闭数据库连接
        conn.Close();
        return commitNumber;
    }

 

文章目录
|